import java.io.BufferedInputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.xuggler.IContainer;

import Vivienda.Trabajo;

public class MobileVideoConsola 
{
	public static int PUERTO_ESCUCHA_STREAMING; 
	
	/**
	 * @param args	Los parametros de entrada de consola
	 * 				[0]: Puerto de escucha del Video Streaming
	 * 				[1]: Ip del Monitor de peticion de inicio de envio video streaming
	 * 				[2]: Puerto de Monitor de peticion de inicio de envio video streaming
	 * 				[3]: Codigo de casa a consultar
	 * 				[4]: Codigo de Camara a consultar
	 */
	public static void main(String[] args) 
	{
		if(args.length != 5)
		{
			System.out.println("Se debe llamar asi: \n [0]: Puerto de escucha de Video Streaming \n [1]: Ip del Monitor de peticion de inicio de envio video streaming \n [2]: Puerto de Monitor de peticion de inicio de envio video streaming \n [3]: Codigo de casa a consultar \n [4]: Codigo de Camara a consultar");
			System.exit(-1);
		}
		
		MobileVideoConsola.PUERTO_ESCUCHA_STREAMING = Integer.parseInt(args[0]);
		String ipMonitor = args[1];
		int puertoMonitor = Integer.parseInt(args[2]);
		String codigoCasaAConsultar = args[3];
		String codigoCamaraAConsultar = args[4];
		
		try
		{
			// Comunica al monitor principal para que inicie el envio del video streaming
			String numeroPuerto = Trabajo.padLeft("" + MobileVideoConsola.PUERTO_ESCUCHA_STREAMING, 5);
			Socket socketMonitor = new Socket(ipMonitor, puertoMonitor);
			PrintWriter escritura = new PrintWriter(socketMonitor.getOutputStream(), true);
			String mensaje = String.format("%s%s%s", numeroPuerto, codigoCasaAConsultar, codigoCamaraAConsultar);
			escritura.println(mensaje);
			escritura.close();
			socketMonitor.close();
			
			// Inicia el puerto de escucha de la transferencia del video streaming
			ServerSocket socketEscucha = new ServerSocket(MobileVideoConsola.PUERTO_ESCUCHA_STREAMING);
			
			while(true)
			{
				// Se queda esperando hasta que la casa envie el video streaming
				new HiloEscuchaStreaming(socketEscucha.accept()).start();
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}

}

class HiloEscuchaStreaming extends Thread
{
	private Socket socketCliente;
	
	public HiloEscuchaStreaming(Socket cliente)
	{
		this.socketCliente = cliente;
	}
	
	public void run()
	{
		try
		{
			// Escucha de transferencia de Streaming
			
			BufferedInputStream bis = new BufferedInputStream(socketCliente.getInputStream());
			
			/*
			int tamanoPedazoLectura = 1024 * 30; 
			
			byte[] datosLeidosMinetrasTanto = new byte[tamanoPedazoLectura];
			int veces = 1;
			int totalBytesGeneral = 0;
			while(bis.available() > 0)
			{
				int numBytesLeidos = bis.read(datosLeidosMinetrasTanto);
				if(numBytesLeidos <= 0)
					break;
				
				System.out.println(String.format("[%d] Han llegado %d bytes de video", veces, numBytesLeidos));
				veces++;
				totalBytesGeneral += numBytesLeidos;
			}
			
			System.out.println(String.format("Se leyeron en total %d bytes", totalBytesGeneral));
			*/
			
			IContainer contenedor = IContainer.make();
			contenedor.open(bis, null);
			
			IMediaReader lector = ToolFactory.makeReader(contenedor);
			lector.addListener(ToolFactory.makeViewer());
			while(lector.readPacket() == null);
			
			bis.close();
			this.socketCliente.close();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

